package com.itany.corejava.code07_常用类.内部类;

/**
 * @author MissChen
 * @date 2024年03月02日 16:37
 */
public class Test01_成员内部类 {
    public static void main(String[] args) {
        Outer outer=new Outer();


        // 在非外部类中实例化内部类
        // 外部类.内部类 变量名 = 外部类对象.new 内部类()
        Outer.Inner inner=outer.new Inner();
        System.out.println(inner.getName());
        // outer.show();
        inner.print();




    }
}

//外部类
class Outer{
    private String name="coco";
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    private void test(){
        System.out.println("这是外部类的private修饰的方法");
    }
    public void show(){
        System.out.println("外部类的方法");

        //在外部类方法中实例化内部类，正常实例化
        Inner inner=new Inner();
        System.out.println(inner.getName());
        inner.setGender("男");
        System.out.println(inner.getGender());
        System.out.println(inner.name);
        System.out.println(inner.gender);
        inner.test();


    }


    //定义成员内部类
    class Inner{
        //内部类中的成员与正常定义类是一样的
        private String name="alice";
        private String gender;

        public Inner() {
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getGender() {
            return gender;
        }

        public void setGender(String gender) {
            this.gender = gender;
        }
        private void test(){
            System.out.println("这是内部类的private修饰的方法");
        }
        public void print(){
            System.out.println("-------这是内部类的方法---------");

            // 当访问外部类属性时, 可以直接写属性名
            //如果内部类存在重名属性，则访问内部类的属性
            System.out.println(age);
            System.out.println(name);

            //在内部类中访问外部类
            Outer outer=new Outer();
            // 可以通过外部类对象.属性名/方法名 来访问外部类属性或者方法
            System.out.println("外部类的name:"+outer.name);

            // 可以通过外部类类名.this.属性名/方法名 来访问外部类属性或者方法
            System.out.println("外部类的name:"+Outer.this.name);

        }
    }
}